ScaffoldMessenger によって管理される SnackBars
まとめ
のSnackBar
内のAPIScaffold
現在は、ScaffoldMessenger
、そのうちの1つは
のコンテキスト内でデフォルトで利用可能MaterialApp
。
コンテクスト
この変更の前は、SnackBar
を呼び出すと表示されます
でScaffold
現在の範囲内でBuildContext
。
電話することでScaffold.of(context).showSnackBar
、
現在Scaffold
をアニメーション化しますSnackBar
視界に入る。
これは現在にのみ適用されますScaffold
、
変更された場合、ルート間で保持されません。
その過程でSnackBar
さんのプレゼンテーション。
次の場合にもエラーが発生します。showSnackBar
の実行中に呼び出されます
非同期イベント、およびBuildContext
無効になった
ルート変更と、Scaffold
処分されてる。
のScaffoldMessenger
今はハンドルしますSnackBar
するために
ルート間で持続し、常に現在のルートに表示されます。Scaffold
。
デフォルトでは、ルートScaffoldMessenger
に含まれていますMaterialApp
、
ただし、独自の制御スコープを作成することもできます。ScaffoldMessenger
さらにコントロールするためにどれの Scaffold
あなたのものを受け取りますSnackBar
s.
変更内容の説明
以前のアプローチでは、Scaffold
を示すSnackBar
。
Scaffold(
key: scaffoldKey,
body: Builder(
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
Scaffold.of(context).showSnackBar(SnackBar(
content: const Text('snack'),
duration: const Duration(seconds: 1),
action: SnackBarAction(
label: 'ACTION',
onPressed: () { },
),
));
},
child: const Text('SHOW SNACK'),
);
},
)
);
新しいアプローチでは、ScaffoldMessenger
見せる
のSnackBar
。この場合、Builder
もうありません
新しいスコープを提供するために必要ですBuildContext
それか
の「下」にありますScaffold
。
Scaffold(
key: scaffoldKey,
body: GestureDetector(
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: const Text('snack'),
duration: const Duration(seconds: 1),
action: SnackBarAction(
label: 'ACTION',
onPressed: () { },
),
));
},
child: const Text('SHOW SNACK'),
),
);
を提示するとき、SnackBar
移行中に、
のSnackBar
を完了しますHero
アニメーション、
スムーズに次のページに進みます。
のScaffoldMessenger
すべての子孫が含まれるスコープを作成します。Scaffold
受け取るために登録してくださいSnackBar
さん、
これが、これらの遷移をまたいで持続する方法です。
ルートを使用する場合ScaffoldMessenger
によって提供されるMaterialApp
、すべての子孫Scaffold
受け取りますSnackBar
さん、
新品でない限りScaffoldMessenger
スコープはツリーのさらに下に作成されます。
独自のインスタンスを作成することで、ScaffoldMessenger
、
どちらを制御できるかScaffold
受け取りますSnackBar
に基づいていないもの
アプリケーションのコンテキストに基づいて。
方法debugCheckHasScaffoldMessenger
アサートすることが可能です
与えられたコンテキストにはScaffoldMessenger
祖先。
を提示しようとしていますSnackBar
なしでScaffoldMessenger
祖先
present の結果は次のようなアサーションになります。
No ScaffoldMessenger widget found.
Scaffold widgets require a ScaffoldMessenger widget ancestor.
Typically, the ScaffoldMessenger widget is introduced by the MaterialApp
at the top of your application widget tree.
移行ガイド
移行前のコード:
// The ScaffoldState of the current context was used for managing SnackBars.
Scaffold.of(context).showSnackBar(mySnackBar);
Scaffold.of(context).hideCurrentSnackBar(mySnackBar);
Scaffold.of(context).removeCurrentSnackBar(mySnackBar);
// If a Scaffold.key is specified, the ScaffoldState can be directly
// accessed without first obtaining it from a BuildContext via
// Scaffold.of. From the key, use the GlobalKey.currentState
// getter. This was previously used to manage SnackBars.
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
Scaffold(
key: scaffoldKey,
body: ...,
);
scaffoldKey.currentState.showSnackBar(mySnackBar);
scaffoldKey.currentState.hideCurrentSnackBar(mySnackBar);
scaffoldKey.currentState.removeCurrentSnackBar(mySnackBar);
移行後のコード:
// The ScaffoldMessengerState of the current context is used for managing SnackBars.
ScaffoldMessenger.of(context).showSnackBar(mySnackBar);
ScaffoldMessenger.of(context).hideCurrentSnackBar(mySnackBar);
ScaffoldMessenger.of(context).removeCurrentSnackBar(mySnackBar);
// If a ScaffoldMessenger.key is specified, the ScaffoldMessengerState can be directly
// accessed without first obtaining it from a BuildContext via
// ScaffoldMessenger.of. From the key, use the GlobalKey.currentState
// getter. This is used to manage SnackBars.
final GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
ScaffoldMessenger(
key: scaffoldMessengerKey,
child: ...
)
scaffoldMessengerKey.currentState.showSnackBar(mySnackBar);
scaffoldMessengerKey.currentState.hideCurrentSnackBar(mySnackBar);
scaffoldMessengerKey.currentState.removeCurrentSnackBar(mySnackBar);
// The root ScaffoldMessenger can also be accessed by providing a key to
// MaterialApp.scaffoldMessengerKey. This way, the ScaffoldMessengerState can be directly accessed
// without first obtaining it from a BuildContext via ScaffoldMessenger.of. From the key, use
// the GlobalKey.currentState getter.
final GlobalKey<ScaffoldMessengerState> rootScaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
MaterialApp(
scaffoldMessengerKey: rootScaffoldMessengerKey,
home: ...
)
rootScaffoldMessengerKey.currentState.showSnackBar(mySnackBar);
rootScaffoldMessengerKey.currentState.hideCurrentSnackBar(mySnackBar);
rootScaffoldMessengerKey.currentState.removeCurrentSnackBar(mySnackBar);
タイムライン
リリースされたバージョン: 1.23.0-13.0.pre
安定版リリース: 2.0.0
参考文献
API ドキュメント:
Scaffold
ScaffoldMessenger
SnackBar
MaterialApp
関連する問題:
- 問題 #57218
- 問題 #62921
関連する PR:
- 足場メッセンジャー
- ScaffoldMessenger の移行